package com.cqhilink.api.common.utils.grant;

import com.alibaba.fastjson.JSON;
import com.cqhilink.api.common.utils.date.DateUtil;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;

/**
 * @author 黄学乾 778142659@qq.com
 * @create 2017-10-31 15:30
 **/
public class GrantUtil {
    // 存储控制加密信息范围值键值对形式
    public static Map<String, Object> grantMap = new HashMap<>();
    // 存储控制加密信息范围值数组形式
    public static List<Grant> grantArrayList = new ArrayList<>();
    private static Logger logger = LoggerFactory.getLogger(GrantUtil.class);

    public GrantUtil() {
    }

    /**
     * @param filePath 文件的地址
     *                 文件地址linux 和  windows 区别
     */
    public static Map<String, Object> grantMap(String filePath) {
        logger.info("grantMap----start");
        InitGrant(filePath);
        logger.info("grantMap----end");
        return grantMap;
    }

    /**
     * @param filePath 文件路径
     *                 初始化文件内容，将加密范范围数据存储到相应的数据变量中
     */
    public static synchronized void InitGrant(String filePath) {
        logger.info("InitGrant----start");
        BufferedReader reader = null;
        try {
            // 读取数据范围的数据流
            reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "GB2312"));
            String tempString = null;
            // 读取行级数据
            while ((tempString = reader.readLine()) != null) {
                logger.info("InitGrant----$tempString:" + tempString);
                // 显示行号
                Grant grant = new Grant();
                // 判断行级数据是否存在
                if (StringUtils.isNotEmpty(tempString)) {
                    String[] grantArray = tempString.split("\\|");
                    grant.setRand(grantArray[0].split("=")[1]);
                    grant.setId(grantArray[1].split("=")[1]);
                    grant.setUserName(grantArray[2].split("=")[1]);
                    grant.setDataTime(grantArray[3].split("=")[1]);
                }
                // 将失效数据存储在范围数据中。
                if (StringUtils.isNotEmpty(grant.getDataTime()) && authDate(grant)) {
                    logger.info("InitGrant----$grant:" + JSON.toJSONString(grant));
                    grantArrayList.add(grant);
                    grantMap.put(grant.getId(), grant);
                } else {


                }
            }
            reader.close();
        } catch (IOException e) {
            logger.error("InitGrant----IOException:e:" + e.getLocalizedMessage());
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                    logger.error("InitGrant--finally--IOException:e1:" + e1.getLocalizedMessage());
                }
            }
        }
        logger.info("InitGrant----end");
    }

    /**
     * 获取文件的Hash值
     *
     * @param filePath 文件路径
     * @return 返回文件MD5Hash值
     */
    public static String getGrantMD5(String filePath) {
        logger.info("getGrantMD5----start");
        StringBuffer sb = new StringBuffer("");
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(FileUtils.readFileToByteArray(new File(filePath)));
            byte b[] = md.digest();
            int d;
            for (int i = 0; i < b.length; i++) {
                d = b[i];
                if (d < 0) {
                    d = b[i] & 0xff;
                    // 与上一行效果等同
                    // i += 256;
                }
                if (d < 16)
                    sb.append("0");
                sb.append(Integer.toHexString(d));
            }
        } catch (NoSuchAlgorithmException e) {
            logger.error("getGrantMD5----NoSuchAlgorithmException:" + e.getLocalizedMessage());
            e.printStackTrace();
        } catch (IOException e) {
            logger.error("getGrantMD5----IOException:" + e.getLocalizedMessage());
            e.printStackTrace();
        }
        logger.error("getGrantMD5---end::" + sb.toString().toUpperCase());
        return sb.toString().toUpperCase();
    }

    /**
     * @param grant 判断范围值的时间范围是否在当前时间之前 则返回true ,否则返回 false
     *              判断时间范围
     */
    public static boolean authDate(Grant grant) {
        logger.error("authDate---start:$grant:" + JSON.toJSONString(grant));
        boolean flag = false;
        if (StringUtils.isNotEmpty(grant.getDataTime())) {
            Long currentTimeS = new Date().getTime();
            Long grantTimeS = DateUtil.StringToDate(grant.getDataTime()).getTime();
            if (grantTimeS - currentTimeS >= 0) {
                flag = true;
            }
        }
        logger.error("authDate---end:$flag:" + flag);
        return flag;
    }

    public static void main(String[] args) {
        //System.out.println(Constant.GRANT_KEY);
        //System.out.println(getGrantMD5(Constant.GRANT_KEY));
    }


}
